/**
**********************************************************************************************************************************************************************************************************************************
* @file:	File.h
* @author:	zinface
* @date:	2021年09月20日 22:26:39 星期一
* @brief:	FinalC 提供的的 File 数据类型操作
**********************************************************************************************************************************************************************************************************************************
**/

#ifndef __FILE__H__
#define __FILE__H__

#include <stdio.h>

#include "FinalC.h"
#include "String.h"
#include "FilePermissions.h"


FinalC_Object_Define(File) {
    long size;
    bool exists;
    String *path;
    FilePermissions *perm;
};
// FinalC_Object_Size(File);

#define FinalC_File_Func_Define(func) \
        FinalC_Object_Func_Suffix(file, func)

// ------------------------------------ file utils
// bool fileExists(File *f);

// bool fileSize(File *f);

static char FCT[][10] = {"r", "w", "rw"};

typedef enum FILE_CTL_TYPE fileCtlType;
enum FILE_CTL_TYPE {
    RO = 0,
    WO = 1,
    RW = 2,
};


void fileLoadInfo(File *f);

// ------------------------------------ Constructor
/**
 * createFile: 创建空的 File 对象实例
 *
 */
FINALC_WARN_UNUSED_RESULT
FinalC_Object_Create_Define(File);

FINALC_WARN_UNUSED_RESULT
FinalC_Object_Create_With_Obj_Define(File, String);

FINALC_WARN_UNUSED_RESULT
FinalC_Object_Create_With_Obj_After_Define(File, String, delete);

/**
 * createFileWith_cstr: 基于给定的字符创建 File 对象实例
 * 
 */
FINALC_WARN_UNUSED_RESULT
File *createFileWith_cstr(char *str);

// ------------------------------------ Destructor
/**
 * destroyFile: 释放 File 对象
 *
 * NOTE: 该对象指向的元素(如有)将不会进行释放，否则使用 deleteFile()
 */
FinalC_Object_Destroy_Define(File);

/**
 * deleteFile: 销毁 File 对象
 *
 * NOTE: 该对象指向的内存(如有)将会进行释放
 */
FinalC_Object_Delete_Define(File);


// ------------------------------------ File Open
// void fileRead(FILE *fp) {

// }

FILE *FinalC_File_Func_Define(Open)(File *f, fileCtlType type);

// ------------------------------------ ReadToString
FINALC_WARN_UNUSED_RESULT
String *FinalC_File_Func_Define(ReadToString)(File *f);

// ------------------------------------ Write With String

void FinalC_File_Func_Define(WriteWithString)(File *f, String *s);

#endif  //!__FILE__H__